package com.wuyou.mid;



import java.util.HashMap;
import java.util.Map;

/**
 * 1487. 保证文件名唯一
 */
public class GetFolderNames {


    public static void main(String[] args) {
//        String[] names = {"pes", "fifa", "gta", "pes(2019)"};
//        String[] names = {"gta", "gta(1)", "gta", "avalon"};
//        String[] names = {"wano","wano","wano","wano"};
//        String[] names = {"kaido","kaido(1)","kaido","kaido(1)"};
//        String[] names = {"kaido","kaido(1)","kaido","kaido(1)","kaido(2)"};
//        String[] names = {"onepiece","onepiece(1)","onepiece(2)","onepiece(3)","onepiece"};
//        String[] names = {"t", "t", "t(1)"};
        String[] names = {"r(1)", "r", "r(2)(1)", "n", "n(4)", "r", "n(1)(1)", "r", "n", "r", "n", "n", "n(2)(3)", "n(1)", "n", "r(1)", "r", "r(2)", "r(2)(1)", "r"};
        System.out.println(sol_2(names));


        String[] s1 = {"l", "p(4)(4)", "v", "c", "i", "k(2)", "y", "a(4)(2)", "t", "a", "e", "e(1)(4)", "p", "p(1)", "s", "z", "s(1)", "q(2)(1)", "r(1)", "m", "b(3)", "u(2)", "j", "p(2)", "t(1)", "s(2)", "g", "o", "o(1)", "b(3)(3)", "k", "w(2)(3)", "q", "a(1)", "z(1)", "t(4)(4)", "s(2)(1)", "c(1)", "w", "u", "h", "g(1)", "b", "r", "c(1)(1)", "v(1)", "n(1)", "r(2)(1)", "u(1)", "t(2)(3)", "p(3)", "m(3)(1)", "h(1)", "o(2)", "y(1)", "n", "s(3)", "z(2)", "k(2)(1)", "x(4)", "l(1)(4)", "g(2)", "u(3)", "t(2)", "m(1)", "c(2)", "t(3)", "g(3)", "c(3)", "a(2)", "r(2)", "d", "y(2)", "b(1)", "p(4)", "m(2)", "w(2)(4)", "v(2)", "t(4)(2)", "x", "e(4)(1)", "h(2)", "f", "z(3)", "e(1)(4)(1)", "t(4)", "b(1)(1)", "x(4)(1)", "m(3)", "j(2)(4)", "s(3)(2)", "z(4)", "l(1)", "p(2)(2)", "g(3)(2)", "q(1)(4)", "h(1)(1)", "h(3)", "o(3)", "h(4)", "f(1)", "n(4)", "s(4)", "g(4)", "s(5)", "r(3)", "n(1)(1)", "x(3)", "r(4)", "f(3)(1)", "e(1)", "j(1)", "s(6)", "g(5)", "d(1)", "l(2)", "g(6)", "o(4)(3)", "x(4)(2)", "u(2)(4)", "x(1)", "t(5)", "f(2)", "j(1)(1)", "v(2)(1)", "w(1)", "v(3)", "t(2)(2)", "l(3)", "o(1)(1)", "a(3)", "y(3)", "q(4)", "m(1)(2)", "i(1)", "u(4)", "l(4)", "c(1)(2)", "g(7)", "l(2)(1)", "p(1)(1)", "k(1)", "d(2)", "l(5)", "o(4)", "m(4)", "i(1)(1)", "j(2)", "i(2)", "f(3)", "y(4)", "b(2)", "k(3)", "z(5)", "n(2)", "t(6)", "c(2)(1)", "y(5)", "q(1)", "b(4)", "t(7)", "m(5)", "g(1)(1)", "r(5)", "m(6)", "l(6)", "s(7)", "n(3)", "j(4)(4)", "m(3)(3)", "n(5)", "n(2)(3)", "s(8)", "t(8)", "l(7)", "e(2)", "p(5)", "q(2)", "v(4)", "v(5)", "b(5)", "w(2)", "m(7)", "p(6)", "g(8)", "h(2)(1)", "n(1)(2)", "q(3)", "x(4)(3)", "q(2)(4)", "s(2)(2)", "w(3)", "k(4)", "f(4)", "v(6)", "n(6)", "q(5)", "w(4)", "y(3)(1)", "a(4)(1)", "r(1)(1)", "r(6)", "f(4)(2)", "l(8)", "f(2)(3)", "p(7)", "o(5)", "h(5)", "t(9)", "i(3)", "r(7)", "k(5)", "p(8)", "l(9)", "o(3)(4)", "f(1)(1)", "j(4)", "f(3)(4)", "o(2)(1)", "j(3)", "k(2)(2)", "k(6)", "x(4)(4)", "s(3)(4)", "p(1)(3)", "y(6)", "r(2)(2)", "i(3)(4)", "j(5)", "p(4)(3)", "e(3)", "j(4)(1)", "g(4)(2)", "x(2)", "l(10)", "x(5)", "g(9)", "w(5)", "o(6)", "t(2)(4)", "s(9)", "f(5)", "o(7)", "h(6)", "h(2)(4)", "z(4)(2)", "w(6)", "l(11)", "n(7)", "q(6)", "w(7)", "l(12)", "a(4)", "o(8)", "v(7)", "h(7)", "b(6)", "v(8)", "b(7)", "k(7)", "x(2)(1)", "r(2)(1)(1)", "g(2)(1)", "c(4)(3)", "w(1)(1)", "g(4)(1)", "z(6)", "i(3)(2)", "r(8)", "e(4)", "p(9)", "z(4)(2)(1)", "s(10)", "c(1)(3)", "h(8)", "l(13)", "j(3)(4)", "x(1)(2)", "a(5)", "b(8)", "t(10)", "c(4)"};
        String[] s2 = {"l", "p(4)(4)", "v", "c", "i", "k(2)", "y", "a(4)(2)", "t", "a", "e", "e(1)(4)", "p", "p(1)", "s", "z", "s(1)", "q(2)(1)", "r(1)", "m", "b(3)", "u(2)", "j", "p(2)", "t(1)", "s(2)", "g", "o", "o(1)", "b(3)(3)", "k", "w(2)(3)", "q", "a(1)", "z(1)", "t(4)(4)", "s(2)(1)", "c(1)", "w", "u", "h", "g(1)", "b", "r", "c(1)(1)", "v(1)", "n(1)", "r(2)(1)", "u(1)", "t(2)(3)", "p(3)", "m(3)(1)", "h(1)", "o(2)", "y(1)", "n", "s(3)", "z(2)", "k(2)(1)", "x(4)", "l(1)(4)", "g(2)", "u(3)", "t(2)", "m(1)", "c(2)", "t(3)", "g(3)", "c(3)", "a(2)", "r(2)", "d", "y(2)", "b(1)", "p(4)", "m(2)", "w(2)(4)", "v(2)", "t(4)(2)", "x", "e(4)(1)", "h(2)", "f", "z(3)", "e(1)(4)(1)", "t(4)", "b(1)(1)", "x(4)(1)", "m(3)", "j(2)(4)", "s(3)(2)", "z(4)", "l(1)", "p(2)(2)", "g(3)(2)", "q(1)(4)", "h(1)(1)", "h(3)", "o(3)", "h(4)", "f(1)", "n(4)", "s(4)", "g(4)", "s(5)", "r(3)", "n(1)(1)", "x(3)", "r(4)", "f(3)(1)", "e(1)", "j(1)", "s(6)", "g(5)", "d(1)", "l(2)", "g(6)", "o(4)(3)", "x(4)(2)", "u(2)(4)", "x(1)", "t(5)", "f(2)", "j(1)(1)", "v(2)(1)", "w(1)", "v(3)", "t(2)(2)", "l(3)", "o(1)(1)", "a(3)", "y(3)", "q(4)", "m(1)(2)", "i(1)", "u(4)", "l(4)", "c(1)(2)", "g(7)", "l(2)(1)", "p(1)(1)", "k(1)", "d(2)", "l(5)", "o(4)", "m(4)", "i(1)(1)", "j(2)", "i(2)", "f(3)", "y(4)", "b(2)", "k(3)", "z(5)", "n(2)", "t(6)", "c(2)(1)", "y(5)", "q(1)", "b(4)", "t(7)", "m(5)", "g(1)(1)", "r(5)", "m(6)", "l(6)", "s(7)", "n(3)", "j(4)(4)", "m(3)(3)", "n(5)", "n(2)(3)", "s(8)", "t(8)", "l(7)", "e(2)", "p(5)", "q(2)", "v(4)", "v(5)", "b(5)", "w(2)", "m(7)", "p(6)", "g(8)", "h(2)(1)", "n(1)(2)", "q(3)", "x(4)(3)", "q(2)(4)", "s(2)(2)", "w(3)", "k(4)", "f(4)", "v(6)", "n(6)", "q(5)", "w(4)", "y(3)(1)", "a(4)(1)", "r(1)(1)", "r(6)", "f(4)(2)", "l(8)", "f(2)(3)", "p(7)", "o(5)", "h(5)", "t(9)", "i(3)", "r(7)", "k(5)", "p(8)", "l(9)", "o(3)(4)", "f(1)(1)", "j(4)", "f(3)(4)", "o(2)(1)", "j(3)", "k(2)(2)", "k(6)", "x(4)(4)", "s(3)(4)", "p(1)(3)", "y(6)", "r(2)(2)", "i(3)(4)", "j(5)", "p(4)(3)", "e(3)", "j(4)(1)", "g(4)(2)", "x(2)", "l(10)", "x(5)", "g(9)", "w(5)", "o(6)", "t(2)(4)", "s(9)", "f(5)", "o(7)", "h(6)", "h(2)(4)", "z(4)(2)", "w(6)", "l(11)", "n(7)", "q(6)", "w(7)", "l(12)", "a(4)", "o(8)", "v(7)", "h(7)", "b(6)", "v(8)", "b(7)", "k(7)", "x(2)(1)", "r(2)(1)(1)", "g(2)(1)", "c(4)(3)", "w(1)(1)", "g(4)(1)", "z(6)", "i(3)(2)", "r(8)", "e(4)", "p(9)", "z(4)(2)(1)", "s(10)", "c(1)(3)", "h(8)", "l(13)", "j(3)(4)", "x(1)(2)", "a(5)", "b(8)", "t(10)", "c(4)"};
        for (int i = 0; i < s1.length; i++) {

            if (!s1[i].equals(s2[i])) {
                System.out.println(i + "------------ s1 -> " + s1[i] + "------  s2 -> " + s2[i]);
            }
        }
    }


    public static String[] sol_2(String[] names) {
        Map<String, Integer> map = new HashMap<>();

        String[] res = new String[names.length];
        int index = 0;
        for (String name : names) {

            String key = name;
            Integer nameCount = map.getOrDefault(name, 0);
            if (nameCount == 0) {
                map.put(key, ++nameCount);
                res[index++] = key;
            } else {
                if (name.charAt(name.length() - 1) == ')') {
                    String s = key + "(" + nameCount++ + ")";
                    while (true) {
                        if (map.getOrDefault(s, 0) == 0) {
                            break;
                        }
                        s = key + "(" + nameCount++ + ")";
                    }
                    res[index++] = s;
                    map.put(name, nameCount);
                    map.put(s, 1);
                } else {
                    String s = key + "(" + nameCount++ + ")";
                    while (true) {
                        if (map.getOrDefault(s, 0) == 0) {
                            break;
                        }
                        s = key + "(" + nameCount++ + ")";
                    }
                    res[index++] = s;
                    map.put(name, nameCount);
                    map.put(s, 1);
                }
            }
        }
        return res;
    }

    // 超时
    public static String[] sol_1(String[] names) {
        Map<String, Integer> map = new HashMap<>();

        String[] res = new String[names.length];
        int index = 0;
        for (String name : names) {

            String key = name;
            if (name.charAt(name.length() - 1) == ')' && map.getOrDefault(name, 0) > 0) {

                int i = name.length() - 1;
                for (; i > 0; i--) {
                    if (name.charAt(i) == '(') {
                        break;
                    }
                    if (name.charAt(i) > '9') {
                        i = -1;
                        break;
                    }
                }
                if (i > 0) {
                    Integer count = map.getOrDefault(key, 0);
                    int num = 1;
                    if (count > 0) {
                        while (true) {
                            String s = key;
                            s += "(" + num++ + ")";
                            if (map.getOrDefault(s, 0) > 0) {
                                count++;
                            } else {
                                key = s;
                                break;
                            }
                        }
                        map.put(key, ++count);
                        res[index++] = key;
                    } else {
                        Integer orDefault = map.getOrDefault(name, 0);
                        map.put(name, ++orDefault);
                        res[index++] = name;
                    }
                } else {
                    Integer count = map.getOrDefault(key, 0);
                    while (true) {
                        String s = key;
                        if (count > 0) {
                            s += "(" + count + ")";
                        }
                        if (map.getOrDefault(s, 0) > 0) {
                            count++;
                        } else {
                            key = s;
                            break;
                        }
                    }
                    map.put(key, ++count);
                    res[index++] = key;
                }
            } else {

                Integer count = map.getOrDefault(key, 0);
                int t = count;
                if (count > 0) {
                    while (true) {
                        String s = key + "(" + count + ")";
                        if (map.getOrDefault(s, 0) > 0) {
                            count++;
                        } else {
                            key = s;
                            break;
                        }
                    }
                }
                map.put(key, t == count ? ++t : 1);
                res[index++] = key;
            }
        }
        return res;
    }
}
